/* Unpacker pour escargot version 0.1 de ++Meat par Kharneth@free.fr Script utilisé avec ODBGScript version 1.42 (fonctionne peut être avec des versions précédentes) Le script génère directement un dump fonctionnel */ // Déclaration des variables var Patch // Contiendra les adresses à patcher var ImportsTable // Adresse originale de la table d'imports var ImageBase // ImageBase du programme var ImportDirectory // Adresse du ImportDirectory RVA var Chemin // Chemin du programme dumpé dbh // Cache le debugger en désactivant le flag PEB.IsDebugged findop eip, #752D# // Cherche le premier JNZ qui teste l'activation de la destruction du PEHeader mov Patch, $RESULT mov [Patch], #EB# // Et le remplace par un JMP findop eip, #C700DEC0AD0B# // Cherche l'instruction qui génère l'exception, immédiatement suivie par l'adresse de la table d'imports mov Patch, $RESULT add Patch, 7 // Ajoute à l'adresse la taille de l'instruction + l'octet du "MOV ESI, xxxx" pour récupérer l'argument mov ImportsTable, [Patch] add Patch, 5 // Ajoute à l'addresse la taille de l'opérande (4 octets) + la taille du JMP (1 octet) mov [Patch], #C6# // Pour modifier la destination du JMP vers le saut vers l'OEP et passer la résolution des imports find eip, #6168????????C3# // Cherche l'adresse du JMP OEP (les ?? représentent l'adresse de l'OEP) mov Patch, $RESULT add Patch, 6 // Se place sur le RET bp Patch // Pour placer un BP dessus run // Lance l'exécution du programme bc Patch // Efface le BP sti // Exécute le RET pour se placer sur l'OEP cmt eip, "Original Entry Point" // Insère un commentaire gmi eip, MODULEBASE // Récupère l'ImageBase du module mov ImageBase, $RESULT mov ImportDirectory, ImageBase add ImportDirectory, 3C // DOSHeader.e_lfanew mov ImportDirectory, [ImportDirectory] add ImportDirectory, ImageBase // Adresse du PEHeader add ImportDirectory, 80 // Adresse de l'ImportDirectory sub ImportsTable, ImageBase // Retranche l'ImageBase à l'adresse de la table d'imports précédemment récupérée pour obtenir le RVA mov [ImportDirectory], ImportsTable // Et l'inscrire dans l'ImportDirectory alloc 1000 // Crée une nouvelle section en mémoire mov Chemin, $RESULT exec // Bloc d'exécution de code ASM pushad call GetCommandLineA // Récupère le chemin du programme mov esi, eax inc esi // Supprime le premier guillemet mov edi, {Chemin} mov ecx, 0FF rep movsb // Copie le chemin dans la mémoire allouée mov eax, 2E // '.' std // Inverse le sens de la boucle mov ecx, 0FF repne scasb // Cherche un '.' dans le fichier à partir de la fin mov dword ptr [edi+2], 504D5544 // insère 'DUMP' juste après le '.' mov dword ptr [edi+6], 6578652E // Ajoute '.exe' mov byte ptr [edi+0A], 0 // Ainsi que le 0 terminal cld // Restaure le sens des boucles popad ende // Fin du bloc ASM dpe [Chemin], eip // Dump le fichier et place l'EntryPoint à EIP eval "Fichier créé dans le dossier :\r\n{[Chemin]}" msg $RESULT // Récupère le Chemin créé et l'affiche free Chemin, 1000 // Libère la mémoire allouée ret // Fin du script